package com.hrt.day02.high


/**
 * 函数和方法的微妙区别
 */
object High2 {
    def main(args: Array[String]): Unit = {
        // 这里就是函数了
        /*val f = foo _  // 把方法转成了函数
        
        f(10)
        foo(10)*/
        
        // 直接定义函数
        // 函数不能声明返回值类型, 只能靠推导
        // () => {  }
        val f: Int => Int = (a: Int) => a * a
        val r: Int = f(10)
        println(r)
        
    }
    //方法
    def foo(a: Int) = println(a)
}
/**
----
函数和方法到底有哪些微妙的区别:
1. 方法:
    严格上来说, 使用def定义的叫方法, 其实不能叫函数
2. 函数也可以直接定义
     // () => {  }
        val f = (a: Int) => a * a
3. 函数和方法之间有一个桥梁:
    可以通过 _ 把方法转成函数
3. 函数可以作为值传递, 方法不行

----
高级特性:

1. 函数可以定义在任何位置.
    可以在函数内定义函数
2. 可以把函数当成一个值返回给函数的调用者,
    函数的调用者就可以在函数的外部去调用这个返回的函数
3. 可以把函数当做一个值, 传递给另外一个函数.

4. 如果一个函数f 可以返回一个函数作为返回值, 或者可以接受一个(多个)函数作为参数,
 那么这个函数f就称为高阶函数!!!
 
 */